package pers.xiaojun.boot.module.system.dao.mapper.permission;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import pers.xiaojun.boot.mybatis.core.convert.PageConvert;
import pers.xiaojun.boot.module.system.controller.permission.vo.role.RoleReqVO;
import pers.xiaojun.boot.module.system.dao.entity.permission.RoleDO;

/**
 * 角色数据访问层
 *
 * @author xiaojun
 * @since 2025-10-10
 */
@Mapper
public interface RoleMapper extends BaseMapper<RoleDO> {

    /**
     * 根据角色名称获取角色
     *
     * @param name 角色名称
     * @return 角色
     */
    default RoleDO selectByName(String name) {
        return this.selectOne(new LambdaQueryWrapper<RoleDO>()
                .eq(RoleDO::getName, name)
        );
    }

    /**
     * 根据角色代码获取角色
     *
     * @param code 角色代码
     * @return 角色
     */
    default RoleDO selectByCode(String code) {
        return this.selectOne(new LambdaQueryWrapper<RoleDO>()
                .eq(RoleDO::getCode, code)
        );
    }

    /**
     * 获取角色分页数据
     *
     * @param roleReqVO 分页条件
     * @return 分页数据
     */
    default Page<RoleDO> selectPage(RoleReqVO roleReqVO) {
        LambdaQueryWrapper<RoleDO> wrapper = new LambdaQueryWrapper<RoleDO>()
                .like(StrUtil.isNotEmpty(roleReqVO.getName()), RoleDO::getName, roleReqVO.getName())
                .like(StrUtil.isNotEmpty(roleReqVO.getCode()), RoleDO::getCode, roleReqVO.getCode())
                .eq(roleReqVO.getStatus() != null, RoleDO::getStatus, roleReqVO.getStatus());

        if (roleReqVO.getCreateTime() != null) {
            wrapper.between(RoleDO::getCreateTime, roleReqVO.getCreateTime()[0], roleReqVO.getCreateTime()[1]);
        }
        wrapper.orderByAsc(RoleDO::getSort);
        return selectPage(PageConvert.INSTANCE.toPage(roleReqVO), wrapper);
    }

}
